/**
 * 
 */
package serveur;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import client.ChaineServeurCli;

/**
 * @author Anthony R. et Johann M.
 *
 */
public class ChaineServeur implements Runnable {
	
	// DONNEES :
	
	/** La fenetre d'affichage */
	private ChaineServeurFrame fen;
	
	/** Port pour le serveur */
	private static final int PORT=404;
		
	/** Groupe de tache */
	private ExecutorService es;
	
	/** Socket du serveur pour attendre les requetes clients */
	private ServerSocket sockserv=null;
	
	/** Objet de communication avec un client */
	private ChaineServeurCli commcli=null;
	
	/** Titre du serveur */
	private static final String TITRE_SERVEUR="Serveur";
	
	// CONSTRUCTEUR 
	
	/**
	 * Constructeur
	 * @param es Groupe de tache
	 */
	public ChaineServeur(ExecutorService es) {
		/* Creation de l'objet de la classe ServerSocket */
		try {
			this.es=es;
			/* Creation Socket Serveur */
			this.sockserv = new ServerSocket(PORT);
			
		} catch (IOException eServeur) {
			eServeur.printStackTrace();
		}
	}
	
	/**
	 * Tache Serveur. Attend les clients et crée un objet communication avec chaque client
	 */
	public void run() {
		/* Boucle d'attente de requetes en provenance d'un client */
		try {
			while (true) {
				try {
					// Attente requete client
					Socket sockcli=this.sockserv.accept();
					// Creation objet communication avec client
					this.commcli= new ChaineServeurCli(this.es, sockcli);
					// Creation tache de communication
					this.es.execute(this.commcli);
				} catch (IOException eServeur2) {
					eServeur2.printStackTrace();
				}
			}
		} finally {
			try {
				// Fermeture port de communication
				sockserv.close();
				
				es.shutdown();
			} catch (IOException eServeur3) {
				eServeur3.printStackTrace();
			}
		}
	}
	
	/**
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String args[]) throws Exception {
		/* Creation de la fenetre */
		ChaineServeurFrame fen=new ChaineServeurFrame(TITRE_SERVEUR);
		
		/* Creation du groupe de tache */
		ExecutorService es= Executors.newFixedThreadPool(4);
		
		/* Creation et lancement de la tache serveur */
		ChaineServeur serv = new ChaineServeur(es);
		es.execute(serv);
	}

}